package store;

import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.jdom.Element;
import org.jdom.xpath.XPath; //import dataview.Termini;
import dataview.Termini;
import dataview.TipoTermine;
import exceptions.DBException;

public class Terminologia extends BaseStore {
	public static Termine vegetale = new Termine(TipoTermine.genere_cibo, "vegetale");
	public static Termine animale = new Termine(TipoTermine.genere_cibo, "animale");
	
	//	public static XMLOutputter o = new XMLOutputter(Format.getPrettyFormat());
	private static Terminologia singleton;
	
	private Terminologia() {}
	
	public static Terminologia getTerminologia() {
		if (singleton == null) singleton = new Terminologia();
		return singleton;
	}
	
	public Termini getRootDiTipo(TipoTermine tipo) {
		Termini termini = new Termini();
		switch (tipo) {
			case genere_cibo:
				termini.add(new Termine(tipo, "vegetale"));
				termini.add(new Termine(tipo, "animale"));
				termini.add(new Termine(tipo, "minerale"));
				termini.add(new Termine(tipo, "bevanda"));
				break;
			case genere_cucina:
			case tipo_occasione:
			case stagionalita:
				try {
					for (String termine : getFoglie(tipo))
						termini.add(new Termine(tipo, termine));
				} catch (DBException e) {
					e.printStackTrace();
				}
				break;
			case genere_geografico:
				termini.add(new Termine(tipo, "americana"));
				termini.add(new Termine(tipo, "asiatica"));
				termini.add(new Termine(tipo, "europea"));
				termini.add(new Termine(tipo, "italiana"));
				termini.add(new Termine(tipo, "francese"));
				termini.add(new Termine(tipo, "africana"));
				termini.add(new Termine(tipo, "austaliana"));
				break;
			case tipo_preparazione:
				termini.add(new Termine(tipo, "conserva"));
				termini.add(new Termine(tipo, "piatto"));
				termini.add(new Termine(tipo, "bibita"));
				termini.add(new Termine(tipo, "preparazione_base"));
				termini.add(new Termine(tipo, "fuoripasto"));
			default:
				break;
		}
		return termini;
	}
	
	public Termini getChildren(Termine padre) {
		Termini children = new Termini();
		try {
			Element elemPadre = (Element)XPath.selectSingleNode(getDB(), "/easycooking/terminologia/" + padre.getTipo().toString() + "/termine[@nome='" + padre.getTermine() + "']");
			if (elemPadre == null) throw new IllegalArgumentException();
			for (Element child : (List<Element>)XPath.selectNodes(elemPadre, "figlio"))
				children.add(new Termine(padre.getTipo(), child.getAttributeValue("nome")));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return children;
	}
	
	/**
	 * Controlla che "termine" abbia come antanato "padre"
	 * 
	 * @param termine Termine da controllare
	 * @param padre Antenato da controllare
	 * @return Ritorna true se "termine" e' un discendente di "padre" o sono uguali, false altrimenti
	 *         (anche nel caso in cui termine e/o padre non siano presenti nel db)
	 */
	protected boolean diTipo(Termine termine, Termine padre) {
		try {
			if (termine.getTipo() != padre.getTipo()) return false;
			if (termine.equals(padre)) return true;
			Element elemPadre = (Element)XPath.selectSingleNode(getDB(), "/easycooking/terminologia/" + padre.getTipo().toString() + "/termine[@nome='" + padre.getTermine() + "']");
			if (elemPadre != null) {
				if (XPath.selectSingleNode(elemPadre, "figlio[@nome='" + termine.getTermine() + "']") != null) return true;
				for (Object element : elemPadre.getChildren("figlio"))
					if (diTipo(termine, new Termine(padre.getTipo(), ((Element)element).getAttributeValue("nome")))) return true;
			}
		} catch (Exception e) {}
		return false;
	}
	
	/**
	 * Metodo che restituisce tutte i termini foglia (non le varie classificazioni) di un certo tipo
	 * 
	 * @param tipo Il tipo dei termini da cercare
	 * @return Un insieme ordinato (anche vuoto) delle stringhe che rappresentano i termini del tipo
	 *         richiesto
	 * @throws DBException
	 */
	public Set<String> getFoglie(TipoTermine tipo) throws DBException {
		return getTermini(tipo, true, true);
	}
	
	/**
	 * Metodo che restituisce tutte i termini non foglia di un certo tipo
	 * 
	 * @param tipo Il tipo dei termini da cercare
	 * @return Un insieme ordinato (anche vuoto) delle stringhe che rappresentano i termini del tipo
	 *         richiesto
	 * @throws DBException
	 */
	public Set<String> getTerminiNonFoglia(TipoTermine tipo) throws DBException {
		return getTermini(tipo, true, false);
	}
	
	/**
	 * Metodo che restituisce tutte i termini (foglia o non foglia) di un certo tipo
	 * 
	 * @param tipo Il tipo dei termini da cercare
	 * @return Un insieme ordinato (anche vuoto) delle stringhe che rappresentano i termini del tipo
	 *         richiesto
	 * @throws DBException
	 */
	public Set<String> getTuttiTermini(TipoTermine tipo) throws DBException {
		return getTermini(tipo, false, true);
	}
	
	@SuppressWarnings("unchecked")
	private Set<String> getTermini(TipoTermine tipo, boolean esclusivamente, boolean foglie) throws DBException {
		try {
			Set<String> set = new TreeSet<String>();
			List<Element> elements = XPath.selectNodes(getDB(), "/easycooking/terminologia/" + tipo.name() + "/termine");
			for (Element element : elements) {
				if (esclusivamente && ((foglie && element.getChildren().size() != 0) || (!foglie && element.getChildren().size() == 0))) continue;
				set.add(element.getAttributeValue("nome").replace('_', ' '));
			}
//				if (esclusivamente) {
//					if (foglie) {
//						if (element.getChildren().size() == 0) set.add(element.getAttributeValue("nome").replace('_', ' '));
//					} else if (element.getChildren().size() != 0) set.add(element.getAttributeValue("nome").replace('_', ' '));
//				} else set.add(element.getAttributeValue("nome").replace('_', ' '));
			return set;
		} catch (Exception e) {
			throw new DBException(e);
		}
	}
	
	/**
	 * Inserisce un termine dato il tipo e il termine di cui e' figlio
	 * 
	 * @param termine Termine da inserire
	 * @param padre Il padre del termine da inserire; null in caso non abbia padre
	 * @throws DBException
	 */
	public void inserisci(Termine termine, Termine padre) throws DBException {
		inserisci(termine, padre, true);
	}
	
	private void inserisci(Termine termine, Termine padre, boolean saveNow) throws DBException {
		boolean cambiamenti = false;
		try {
			Element newEl = new Element("termine").setAttribute("nome", termine.getTermine());
			Element set = (Element)XPath.selectSingleNode(getDB(), "/easycooking/terminologia/" + termine.getTipo().name());
			if (padre != null) {
				if (termine.getTipo() != padre.getTipo()) throw new DBException("I due termini non sono dello stesso tipo");
				Element padreElem = (Element)XPath.selectSingleNode(getDB(), "/easycooking/terminologia/" + termine.getTipo().name() + "/termine[@nome='" + padre.getTermine() + "']");
				if (XPath.selectSingleNode(padreElem, "figlio[@nome='" + termine.getTermine() + "']") == null) {
					padreElem.addContent(new Element("figlio").setAttribute("nome", termine.getTermine()));
					cambiamenti = true;
				}
			}
			if (XPath.selectSingleNode(set, "termine[@nome='" + termine.getTermine() + "']") == null) {
				set.addContent(newEl);
				cambiamenti = true;
			}
			
			if (cambiamenti && saveNow) save(false);
		} catch (Exception e) {
			throw new DBException(e);
		}
	}
	
	public void initialize() throws DBException {
		//Elimino tutti i dati precedenti
		Element terminologia = getDB().getRootElement().getChild("terminologia");
		for (TipoTermine tipoTermine : TipoTermine.values())
			terminologia.getChild(tipoTermine.name()).removeContent();
		
		//Inizializzazione Stagionalita'
		inserisci(new Termine(TipoTermine.stagionalita, "estiva"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "autunnale"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "invernale"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "natalizia"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "pasquale"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "halloween"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "san_valentino"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "festa_della_mamma"), null, false);
		inserisci(new Termine(TipoTermine.stagionalita, "carnevale"), null, false);
		
		//Inizializzazione GenereCucina
		inserisci(new Termine(TipoTermine.genere_cucina, "tradizionale"), null, false);
		inserisci(new Termine(TipoTermine.genere_cucina, "creativa"), null, false);
		inserisci(new Termine(TipoTermine.genere_cucina, "molecolare"), null, false);
		inserisci(new Termine(TipoTermine.genere_cucina, "casalinga"), null, false);
		
		//Inizializzazione TipoOccasione
		inserisci(new Termine(TipoTermine.tipo_occasione, "colazione"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "brunch"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "pranzo"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "cena"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "aperitivo"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "apertivivo_rinforzato"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "te_pomeridiano"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "pranzo_a_buffet"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "cena_a_buffet"), null, false);
		inserisci(new Termine(TipoTermine.tipo_occasione, "pausa_caffe"), null, false);
		
		//Inizializzazione GenereGeografico
		Termine americana = new Termine(TipoTermine.genere_geografico, "americana");
		Termine asiatica = new Termine(TipoTermine.genere_geografico, "asiatica");
		Termine europea = new Termine(TipoTermine.genere_geografico, "europea");
		Termine italiana = new Termine(TipoTermine.genere_geografico, "italiana");
		Termine francese = new Termine(TipoTermine.genere_geografico, "francese");
		Termine africana = new Termine(TipoTermine.genere_geografico, "africana");
		Termine australiana = new Termine(TipoTermine.genere_geografico, "austaliana");
		inserisci(americana, null, false);
		inserisci(asiatica, null, false);
		inserisci(europea, null, false);
		inserisci(italiana, europea, false);
		inserisci(francese, europea, false);
		inserisci(africana, null, false);
		inserisci(australiana, null, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "USA"), americana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "canadese"), americana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "argentina"), americana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "peruviane"), americana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "cilena"), americana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "messicana"), americana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "cinese"), asiatica, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "giapponese"), asiatica, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "turca"), asiatica, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "libanese"), asiatica, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "ligure"), italiana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "veneta"), italiana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "lombarda"), italiana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "piemontese"), italiana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "bretone"), francese, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "provenzale"), francese, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "alsaziana"), francese, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "egiziana"), africana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "marocchina"), africana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "tunisina"), africana, false);
		inserisci(new Termine(TipoTermine.genere_geografico, "senegalese"), africana, false);
		
		//Inizializzazione TipoPrerazione
		Termine conserva = new Termine(TipoTermine.tipo_preparazione, "conserva");
		Termine piatto = new Termine(TipoTermine.tipo_preparazione, "piatto");
		Termine cocktail = new Termine(TipoTermine.tipo_preparazione, "cocktail");
		Termine frullato = new Termine(TipoTermine.tipo_preparazione, "frullato");
		Termine bevandaCalda = new Termine(TipoTermine.tipo_preparazione, "bevanda_calda");
		Termine bibita = new Termine(TipoTermine.tipo_preparazione, "bibita");
		Termine preparazioneBase = new Termine(TipoTermine.tipo_preparazione, "preparazione_base");
		Termine fuoripasto = new Termine(TipoTermine.tipo_preparazione, "fuoripasto");
		
		inserisci(conserva, null, false);
		inserisci(piatto, null, false);
		inserisci(bibita, null, false);
		inserisci(cocktail, bibita, false);
		inserisci(frullato, bibita, false);
		inserisci(bevandaCalda, bibita, false);
		inserisci(preparazioneBase, null, false);
		inserisci(fuoripasto, null, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "marmellata"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "sottolio"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "sottaceto"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "sottosale"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "sotto_spirito"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "gelatina"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "condimento"), conserva, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "antipasto"), piatto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "primo_piatto"), piatto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "secondo_piatto"), piatto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "piatto_unico"), piatto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "contorno"), piatto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "dolce"), piatto, false);
		inserisci(cocktail, bibita, false);
		inserisci(frullato, bibita, false);
		inserisci(bevandaCalda, bibita, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "cocktail_alcolico"), cocktail, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "cocktail_analcolico"), cocktail, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "smoothie"), frullato, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "centrifugato"), frullato, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "frappe"), frullato, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "caffe"), bevandaCalda, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "te"), bevandaCalda, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "tisana"), bevandaCalda, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "crema"), preparazioneBase, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "salsa"), preparazioneBase, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "pasta"), preparazioneBase, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "snack"), fuoripasto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "stuzzichino"), fuoripasto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "salatino"), fuoripasto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "pasticcino"), fuoripasto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "cioccolatino"), fuoripasto, false);
		inserisci(new Termine(TipoTermine.tipo_preparazione, "caramella"), fuoripasto, false);
		
		//Inizializzazione GenereCibo
		Termine minerale = new Termine(TipoTermine.genere_cibo, "minerale");
		Termine animale = new Termine(TipoTermine.genere_cibo, "animale");
		Termine frutta = new Termine(TipoTermine.genere_cibo, "frutta");
		Termine olio = new Termine(TipoTermine.genere_cibo, "olio");
		Termine verdura = new Termine(TipoTermine.genere_cibo, "verdura");
		Termine carne = new Termine(TipoTermine.genere_cibo, "carne");
		Termine carneBianca = new Termine(TipoTermine.genere_cibo, "carne_bianca");
		Termine carneRossa = new Termine(TipoTermine.genere_cibo, "carne_rossa");
		Termine latticini = new Termine(TipoTermine.genere_cibo, "latticini");
		Termine pesce = new Termine(TipoTermine.genere_cibo, "pesce");
		
		Termine bevanda = new Termine(TipoTermine.genere_cibo, "bevanda");
		Termine bevandaAlcolica = new Termine(TipoTermine.genere_cibo, "bevanda_alcolica");
		Termine bevandaAnalcolica = new Termine(TipoTermine.genere_cibo, "bevanda_analcolica");
		Termine vino = new Termine(TipoTermine.genere_cibo, "vino");
		Termine liquore = new Termine(TipoTermine.genere_cibo, "liquore");
		Termine liquoreAnimale = new Termine(TipoTermine.genere_cibo, "liquore_animale");
		Termine liquoreVegetale = new Termine(TipoTermine.genere_cibo, "liquore_vegetale");
		Termine birra = new Termine(TipoTermine.genere_cibo, "birra");
		Termine softDrink = new Termine(TipoTermine.genere_cibo, "soft_drink");
		Termine acqua = new Termine(TipoTermine.genere_cibo, "acqua");
		
		Termine dolcificanteNaturale = new Termine(TipoTermine.genere_cibo, "dolcificante_naturale");
		Termine dolcificanteArtificiale = new Termine(TipoTermine.genere_cibo, "dolcificante_artificiale");
		Termine dolcificante = new Termine(TipoTermine.genere_cibo, "dolcificante");
		
		inserisci(minerale, null, false);
		inserisci(vegetale, null, false);
		inserisci(animale, null, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "sale"), minerale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "aceto"), vegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "spezia"), vegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "zucchero"), vegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "cereale"), vegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "legume"), vegetale, false);
		inserisci(olio, vegetale, false);
		inserisci(frutta, vegetale, false);
		inserisci(verdura, vegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vedura_a_foglia"), verdura, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "radici_tuberi_e_rizomi"), verdura, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "frutta_fresca"), frutta, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "frutta_secca_con_guscio"), frutta, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "frutta_secca_senza_guscio"), frutta, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "frutta_esotica"), frutta, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "olio_di_oliva"), olio, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "olio_di_semi"), olio, false);
		inserisci(carne, animale, false);
		inserisci(carneRossa, carne, false);
		inserisci(carneBianca, carne, false);
		inserisci(latticini, carne, false);
		inserisci(pesce, carne, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vitello"), carneBianca, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "avicola"), carneBianca, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "coniglio"), carneBianca, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "equina"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "caprina"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "manzo"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "ovina"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "suina"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vitellone"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "selvaggina"), carneRossa, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "latte"), latticini, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "formaggio"), latticini, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "yogurt"), latticini, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "burro"), latticini, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "di_mare"), pesce, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "di_acqua_dolce"), pesce, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "crostacei"), pesce, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "molluschi"), pesce, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "uova"), animale, false);
		
		inserisci(bevanda, null, false);
		inserisci(bevandaAlcolica, bevanda, false);
		inserisci(bevandaAnalcolica, bevanda, false);
		inserisci(vino, bevandaAlcolica, false);
		inserisci(vino, vegetale, false);
		inserisci(birra, bevandaAlcolica, false);
		inserisci(birra, vegetale, false);
		inserisci(liquore, bevandaAlcolica, false);
		inserisci(liquoreAnimale, liquore, false);
		inserisci(liquoreAnimale, animale, false);
		inserisci(liquoreVegetale, liquore, false);
		inserisci(liquoreVegetale, vegetale, false);
		inserisci(acqua, bevandaAnalcolica, false);
		inserisci(softDrink, bevandaAnalcolica, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "sidro"), bevandaAlcolica, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "liquore_con_rosso_cocciniglia"), liquoreAnimale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "distillato"), liquoreVegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "amaro"), liquoreVegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vermouth"), liquoreVegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "liquore_dolce"), liquoreVegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "digestivo"), liquoreVegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vino_bianco"), vino, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vino_rose"), vino, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vino_rosso"), vino, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vino_spumante"), vino, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "vino_liquoroso"), vino, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "doppio_malto"), birra, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "lager"), birra, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "pilsener"), birra, false);
		inserisci(acqua, minerale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "coca_cola"), softDrink, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "aranciata"), softDrink, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "soda"), softDrink, false);
		
		inserisci(dolcificante, null, false);
		inserisci(dolcificanteArtificiale, dolcificante, false);
		inserisci(dolcificanteArtificiale, minerale, false);
		inserisci(dolcificanteNaturale, dolcificante, false);
		inserisci(dolcificanteNaturale, vegetale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "aspartame"), dolcificanteArtificiale, false);
		inserisci(new Termine(TipoTermine.genere_cibo, "fruttosio"), dolcificanteNaturale, false);
		
		save(true);
	}
}
